﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Entities;
using BusinessLogicLayer.Validation;
using DataAccessLayer;
using System.Linq.Expressions;

namespace BusinessLogicLayer
{
    public class QuanLyKeHoachManager : IValidation<QuanLyKeHoachGiangDay>
    {
        private readonly IRepository<QuanLyKeHoachGiangDay> _repository;

        public QuanLyKeHoachManager(IRepository<QuanLyKeHoachGiangDay> rp)
        {
            _repository = rp;
        }
        public ValidationResult Validate(QuanLyKeHoachGiangDay obj)
        {
            var result = new ValidationResult();
            if(string.IsNullOrEmpty(obj.MaQL.Trim()))
                result.Messages.Add("Mã quản lý phải khác rỗng");
            if(obj.NamHoc.Length < 8)
                result.Messages.Add("Năm học không được để trống");
            else{
                int y = Convert.ToInt32(obj.NamHoc.Substring(0, 4));
                int y2 = Convert.ToInt32(obj.NamHoc.Substring(5, 4));
                if(y < DateTime.Now.Year || y != y2 - 1)
                    result.Messages.Add("Năm học không đúng và hai năm phải liên tiếp nhau");
            }
            if(Convert.ToInt32(obj.HocKy) < 0 || Convert.ToInt32(obj.HocKy) > 3)
                result.Messages.Add("Học kỳ chỉ được 1, 2 hoặc 3");
            return result;
        }

        public ActionResult InsertOrUpdate(QuanLyKeHoachGiangDay ql)
        {
            var result = new ActionResult();
            try
            {
                if (!_repository.InsertOrUpdate(ql))
                    result.ex.Add(new Exception("Thêm kế hoạch giảng dạy không thành công"));

            }
            catch (Exception ex){
                result.ex.Add(ex);
            }
            return result;
        }

        public ActionResult Delete(QuanLyKeHoachGiangDay ql)
        {
            var result = new ActionResult();
            try
            {
                if (!_repository.Delete(ql))
                    result.ex.Add(new Exception("Xóa kế hoạch giảng dạy không thành công"));

            }
            catch (Exception ex)
            {
                result.ex.Add(ex);
            }
            return result;
        }

        public ActionResult Delete(string _maql)
        {
            var result = new ActionResult();
            try
            {
                if (!_repository.Delete(s => s.MaQL == _maql))
                    result.ex.Add(new Exception("Xóa kế hoạch giảng dạy không thành công"));
            }
            catch (Exception ex)
            {
                result.ex.Add(ex);
            }
            return result;
        }

        public ActionResultAsList<QuanLyKeHoachGiangDay> Find(Expression<Func<QuanLyKeHoachGiangDay, bool>> ql)
        {
            var result = new ActionResultAsList<QuanLyKeHoachGiangDay>();
            try
            {
                result.Result = _repository.Find(ql).ToList();
                if (result.Result.Count == 0)
                    result.ex.Add(new Exception("Không tìm thấy kế hoạch"));
            }
            catch (Exception ex)
            {
                result.ex.Add(ex);
            }
            return result;
        }
    }
}
